flowbox: Implement get_child_at_pos properly
authorTimm Bäder <mail@baedert.org>
Thu, 14 Feb 2019 06:11:34 +0000 (07:11 +0100)
committerTimm Bäder <mail@baedert.org>
Sat, 16 Feb 2019 14:45:06 +0000 (15:45 +0100)
With transforms in the mix, checking if the coordinate is inside the
widget "allocation" makes even less sense. Just use gtk_widget_pick()
and walk up until we find a GtkFlowBoxChild.

gtk/gtkflowbox.c

index f95d8734e16a7be1747312854fe014d568ac3f47..65c491fe4b9e6ee32f37cd75adf7cd0abf7efaa1 100644 (file)
@@ -3918,7 +3918,7 @@ gtk_flow_box_get_child_at_index (GtkFlowBox *box,
  * @y: the y coordinate of the child
  *
  * Gets the child in the (@x, @y) position. Both @x and @y are
- * assumed to be relative to the allocation of @box.
+ * assumed to be relative to the origin of @box.
  *
  * Returns: (transfer none) (nullable): the child widget, which will
  *     always be a #GtkFlowBoxChild or %NULL in case no child widget
@@ -3929,24 +3929,12 @@ gtk_flow_box_get_child_at_pos (GtkFlowBox *box,
                                gint        x,
                                gint        y)
 {
-  GtkWidget *child;
-  GSequenceIter *iter;
-  GtkAllocation allocation;
-
-  for (iter = g_sequence_get_begin_iter (BOX_PRIV (box)->children);
-       !g_sequence_iter_is_end (iter);
-       iter = g_sequence_iter_next (iter))
-    {
-      child = g_sequence_get (iter);
-      if (!child_is_visible (child))
-        continue;
+  GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y);
 
-      gtk_widget_get_allocation (child, &allocation);
-      if (gdk_rectangle_contains_point (&allocation, x, y))
-        return GTK_FLOW_BOX_CHILD (child);
-    }
+  if (!child)
+    return NULL;
 
-  return NULL;
+  return (GtkFlowBoxChild *)gtk_widget_get_ancestor (child, GTK_TYPE_FLOW_BOX_CHILD);
 }
 
 /**